package pl.peterjack.servlet.dane.faktura;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.impl.LogFactoryImpl;

import pl.peterjack.model.PMF;
import pl.peterjack.model.dane.Faktura;
import pl.peterjack.model.dane.FakturaDane;
import pl.peterjack.model.dane.FakturaProdukt;
import pl.peterjack.model.dane.Firma;
import pl.peterjack.model.dane.Klient;
import pl.peterjack.model.dane.Pracownik;
import pl.peterjack.model.dane.PracownikUprawnienia;
import pl.peterjack.model.dane.RezultatOdpowiedz;
import pl.peterjack.model.jdo.FakturaJDO;

import com.google.appengine.api.datastore.Key;
import com.google.gson.Gson;

public class FakturaLista extends HttpServlet {
	
	Log log = new LogFactoryImpl().getInstance( getClass() );

	@SuppressWarnings("unchecked")
	@Override 
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		Pracownik pracownik = (Pracownik) req.getSession().getAttribute("firma_pracownik");
		PracownikUprawnienia pracownikUprawnienie = null;
		if (pracownik != null && pracownik.getPracownikUprawnienia() != null
				&& pracownik.getPracownikUprawnienia().longValue() > 0) {
			pracownikUprawnienie = pm.getObjectById(PracownikUprawnienia.class,
					pracownik.getPracownikUprawnienia());
		}
		if (!(pracownik == null || pracownikUprawnienie == null || (pracownikUprawnienie
						.getZarzadzanieFakturami() != null && pracownikUprawnienie
						.getZarzadzanieFakturami().booleanValue()))) {
			req.getSession().invalidate();
			resp.setContentType("text/plain");
			resp.setStatus(resp.SC_MOVED_TEMPORARILY);
			resp.setHeader("Location", "/");
			return;
		}
		RezultatOdpowiedz result = new RezultatOdpowiedz();
		try {
		    Firma firma = (Firma) req.getSession().getAttribute("firma");
		    List<Faktura> results = null;
		    Klient klient = (Klient) req.getSession().getAttribute("firma_klient"); 
		    if(klient == null) {
		    	Query query = pm.newQuery(Faktura.class, "firma == firmaPodana");
				query.declareParameters(Key.class.getName() + " firmaPodana");
				results = (List<Faktura>) query.execute(firma.getId());
		    } else {
				String queryStr = "select from " + Faktura.class.getName()
						+ " where firma == :p1 && klient == :p2  ";
		    	results = (List<Faktura>) pm.newQuery(queryStr).execute(firma.getId(), klient.getId());
		    }
			List<FakturaDane> resultsDane = new ArrayList<FakturaDane>(); 
			for(Faktura f:results) {
				FakturaDane fakturaDane = new FakturaDane(f, FakturaJDO.getKlient(f));
				List<FakturaProdukt> listaProduktow = FakturaJDO.getFakturaProdukty(f); 
				float suma = 0; 
				for(FakturaProdukt fp:listaProduktow) {
					suma += fp.getCenaBrutto()*fp.getIlosc(); 
				}
				fakturaDane.setSumaBrutto(suma+" zl"); 
				resultsDane.add(fakturaDane);
			}
		    result.setData( results  );
			result.setSuccess(true); 
		    Gson gson = new Gson();
		    //resp.setContentType("application/json");
		    resp.setCharacterEncoding("UTF-8");
	        resp.getWriter().println("{\"items\":"+gson.toJson(resultsDane)+"}");
		} catch (Exception e) { 
			log.error(e);
			result.setSuccess(false);
		} finally {
            pm.close();
        }
	}

}	

